import { GoodsSyncExecutor } from '@/ts/base/model';
import { Executor } from '.';
import { FormData } from './index';
import { ProductManager } from '../../mall/product';

/**
 * 商品信息同步
 */
export class MallGoodsSync extends Executor<GoodsSyncExecutor> {
  private productManager: ProductManager = new ProductManager(this.task);

  /**
   * 执行商品信息同步任务
   * @param data 表单数据
   */
  async execute(data: FormData): Promise<boolean> {
    try {
      // 获取当前实例数据
      const instance = this.task.instanceData;
      if (!instance) {
        return false;
      }
      // 解析子表数据并转换成商品列表
      const productData = this.extractProductData(instance);
      if (productData.length === 0) {
        console.warn('没有需要同步的商品数据');
        return false;
      }

      // 批量添加商品
      this.productManager.addProductList(productData);

      // 批量保存商品信息
      const result = await this.productManager.saveBatch();

      // 保存成功后清空批次
      if (result) {
        this.productManager.clear();
      }
      return result;
    } catch (error) {
      console.error('商品批量同步失败:', error);
      return false;
    }
  }

  /**
   * 解析实例数据，提取商品数据
   * @param instance 任务实例数据
   * @returns 商品数据数组
   */
  private extractProductData(instance: any): any[] {
    const detailForms = instance?.node?.detailForms || [];

    return detailForms.flatMap((form: { id: string | number }) => {
      const detailForm = instance?.data?.[form.id];
      if (!detailForm) return [];

      return detailForm.flatMap((item: { after: never[] }) => {
        const originData = item.after || [];
        return originData.map((dataItem: any) => ({
          id: dataItem.id,
          title: dataItem.title,
          price: dataItem.price,
          count: Number(dataItem.count),
          remark: dataItem.remark,
          belongId: dataItem.belongId,
          resource: JSON.stringify(dataItem),
          createUser: dataItem.createUser,
          updateUser: dataItem.updateUser,
          createTime: dataItem.createTime,
          updateTime: dataItem.updateTime,
        }));
      });
    });
  }
}
